/** Clase para consultar la carga de la memoria **/

package clientegestionred;

import common.Consulta;
import common.Cons;
import common.SesionSNMP;

import java.util.LinkedList;

import org.snmp4j.smi.*;


public class UsoMemoria implements Cons {

    private Consulta consulta; //objeto para hacer consultas al agente
   
    /* Constructor */
    public UsoMemoria(SesionSNMP sesion) {
        consulta = new Consulta(sesion);
    }

    /* Metodo para la consulta de informacion de memoria, e impresion
     de la misma por pantalla */
    public int getMemoryInfo(){

        // Realizar las consultas de los distintos campos que interesan
        LinkedList names = consulta.getColumn(HR_STORAGE_DESC);
        LinkedList units = consulta.getColumn(HR_STORAGE_ALLOCATION_UNITS);
        LinkedList sizes = consulta.getColumn(HR_STORAGE_SIZE);
        LinkedList uso = consulta.getColumn(HR_STORAGE_USED);

        if (names == null || units == null || sizes == null || uso == null){
            return -1;
        }
        
        // Calculo del tamaño de las memorias en bytes
        long []bytesDisponibles = new long[units.size()];
        for (int i = 0; i < units.size(); i++){
            bytesDisponibles[i] = ((Variable)(units.get(i))).toLong() *
                    ((Variable)(sizes.get(i))).toLong();
        }

        // Calculo de los bytes usados
        long []bytesUsados = new long[uso.size()];
        for (int i = 0; i < uso.size(); i++){
            bytesUsados[i] = ((Variable)(units.get(i))).toLong() * ((Variable)
                    (uso.get(i))).toLong();
        }

        // Mostrar por pantalla la informacion
        System.out.println("\nInformacion de las distintas unidades de memoria"
                + " (Nombre - Tamaño - Uso - Porcentaje de uso)");
        for (int i = 0; i < names.size(); i++){
            System.out.print("\t- " + names.get(i).toString() +" - ");
            imprimeEnUnidadAdecuada(bytesDisponibles[i]);
            imprimeEnUnidadAdecuada(bytesUsados[i]);
            if(bytesDisponibles[i] == 0){
                System.out.println("0%");
            } else{
                System.out.println(redondear((float)bytesUsados[i]/
                        (float)bytesDisponibles[i]*100) + "%");
            }
            
        } //for

        return 0;

    } //getMemoryInfo

    /* Metodo para imprimir una cantidad (bytes) de manera adecuada
     segun su tamaño */
    private void imprimeEnUnidadAdecuada(long cantidad){
        double div;
        if (cantidad > (div = Math.pow( 1024, 3 )))
            System.out.print(redondear(cantidad/div) + " Gbytes - ");
        else if (cantidad > (div = Math.pow( 1024, 2 )))
                System.out.print(redondear(cantidad/div) + " Mbytes - ");
             else if (cantidad > (div = 1024))
                    System.out.print(redondear(cantidad/div) + " Kbytes - ");
                  else System.out.print(cantidad + " bytes - ");
    }

    /* Redondear 2 decimales */
    private double redondear(double n){
        return Math.rint(n *100)/100;
    }

} //class